/*
    调用wait/waitpid可以释放子进程的资源
    若没有调用，则子进程退出后会变成“僵尸进程”

    孤儿进程：
        父进程已终止，但子进程仍在运行，由init进程回收
        基本无害
    僵尸进程：
        子进程已终止，但父进程尚未回收其资源
        有害（资源泄漏）
    非阻塞等待，父进程不等待子进程，如果父进程先退出，子进程将变为孤儿进程，子进程由init进程代为回收
    阻塞等待，父进程亲自、立即回收子进程资源

*/

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
    pid_t pid;
    pid = fork();
    if (pid == 0)
    {
        sleep(3);

        return 0;
    }
    else if (pid > 0)
    {
        int status;
        waitpid(pid, &status, WNOHANG);//非阻塞等待，父进程不等待子进程，如果父进程先退出，子进程由init进程代为回收
        // waitpid(pid, &status, 0);//阻塞等待，父进程亲自、立即回收子进程资源

        if (WIFEXITED(status))
        {
            printf("child exit code:%d\n", WEXITSTATUS(status));
        }
    }
    else
    {
        perror("fork error");
        return -1;
    }
}
/*
    结果：
    child exit code:0
*/